﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Windows.Forms;
using System.Globalization;
using LarDosIdosos.Business.Model;
using LarDosIdosos.DataSources;
using CheckBox = System.Web.UI.WebControls.CheckBox;
using TextBox = System.Web.UI.WebControls.TextBox;

namespace LarDosIdosos
{
    public partial class CadastroDoIdoso : System.Web.UI.Page
    {
        private static List<Business.Model.Responsavel> listaDeResponsaveis;
        private bool EnableTextBoxGrauDeParentesco;

        private Business.Model.Funcionario funcionario;
        private const string Acesso = "acesso";
        private const string Editar = "editar";
        private static string paginaDeOrigem;

        protected void Page_Load(object sender, EventArgs e)
        {
            CarregaFuncionario();
            if (!ValidaPermissao("acesso"))
            {
                Response.Redirect("~/Default.aspx");
            }
            var param1 = Request.QueryString["Alterar"];
            var param2 = Request.QueryString["Alterado"];
            if (!IsPostBack && !IsCallback)
            {
                if (!string.IsNullOrEmpty(param1) && !string.IsNullOrEmpty(param2))
                {

                    if (Convert.ToBoolean(param1))
                    {
                        int codigo;
                        if (int.TryParse(param2, out codigo))
                        {
                            MontaPaginaComDetalhesDoIdoso(codigo);
                        }
                    }
                }
                paginaDeOrigem = "~" + HttpContext.Current.Request.UrlReferrer.LocalPath;
            }
			
        }

        private void CarregaFuncionario()
        {
            if (Session["usuario"] != null)
            {
                funcionario = (Business.Model.Funcionario)Session["usuario"];
            }
        }

        //Note: Valida a permissão do funcionario
        private bool ValidaPermissao(string tipo)
        {
            if (funcionario != null)
            {
                switch (tipo)
                {
                    case Acesso:
                        if (funcionario.Cargo_Funcionario.CodigoCargo == 2 ||
                            funcionario.Cargo_Funcionario.CodigoCargo == 4 ||
                            funcionario.Cargo_Funcionario.CodigoCargo == 5)
                        {
                            return true;
                        }
                        break;
                    case Editar:
                        if (funcionario.Cargo_Funcionario.CodigoCargo == 2)
                        {
                            return true;
                        }
                        break;
                }
            }
            return false;
        }

        private void MontaPaginaComDetalhesDoIdoso(int codigo)
        {
            DataSourceIdoso dataSource = new DataSourceIdoso();
            Idoso idoso = dataSource.BuscaIdoso(codigo);
            CarregaVisualizacaoDoIdoso(idoso);
        }

        public void CarregaVisualizacaoDoIdoso(Idoso idoso)
        {
            try
            {
                hiddenFieldCodigoIdoso.Value = idoso.Codigo_Idoso.ToString();
				hiddenFieldLocalFotoIdoso.Value = idoso.Foto_Idoso;
				hiddenFieldLocalRelatorioIdoso.Value = idoso.Relatorio_De_Encaminhamento;
                textNomeDoIdoso.Text = idoso.Nome_Idoso;
                textCpfDoIdoso.Text = idoso.CPF_Idoso;
                textRgDoIdoso.Text = idoso.RG_Idoso;
                textDataDeNascimento.Text = idoso.Data_de_Nascimento.ToString("dd/MM/yyyy");
                radioButtonListSexoDoIdoso.SelectedValue = idoso.Sexo_Idoso.Codigo_Sexo.ToString();
                dropDownListEstadoCivil.SelectedValue = idoso.Estado_Civil.Codigo_Estado_Civil.ToString();
                textBoxNacionalidade.Text = idoso.Nacionalidade_Idoso;
                textBoxNaturalidade.Text = idoso.Naturalidade_Idoso;
                textBoxGrauDeIntrucao.Text = idoso.Grau_de_Instrucao_Idoso;
                textBoxNomeDoPai.Text = idoso.Nome_do_Pai_Idoso;
                textBoxNomeDaMae.Text = idoso.Nome_da_Mae_Idoso;
                if(idoso.Relatorio_De_Encaminhamento != "")
                {
                    statusFileUploadRelatorio.Text = idoso.Relatorio_De_Encaminhamento.Substring(idoso.Relatorio_De_Encaminhamento.LastIndexOf('/') + 1);
                }
				if(idoso.Foto_Idoso != "")
				{
					imageFotoIdoso.ImageUrl = "/Arquivos/"+idoso.Foto_Idoso;
				}
                List<Funcionario> funcionarios = new List<Funcionario>();
                funcionarios.Add(idoso.Funcionario);


                gridViewFuncionario.DataSource = funcionarios;
                gridViewFuncionario.DataBind();

                listaDeResponsaveis = ObtemResponsaveisDoIdoso(idoso.Codigo_Idoso);
                gridViewResponsaveis.DataSource = listaDeResponsaveis;
                gridViewResponsaveis.DataBind();


                gridViewFuncionario.Visible = true;
                gridViewResponsaveis.Visible = true;
                gridViewAddResponsaveis.Visible = false;


            }
            catch (Exception ex)
            {
                throw new Exception("Erro na visualização do idoso.", ex);
            }
        }

        private List<Business.Model.Responsavel> ObtemResponsaveisDoIdoso(int codigoIdoso)
        {
            DataSourceResponsavel dataSourceResponsavel = new DataSourceResponsavel();
            return dataSourceResponsavel.BuscaResponsaveisDoIdoso(codigoIdoso);
        }

        protected void gridViewResponsaveis_OnRowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                TextBox textBox = (TextBox)e.Row.FindControl("textBoxGrauDeParentesco");
                textBox.Enabled = EnableTextBoxGrauDeParentesco;
            }
        }

        protected void gridViewAddResponsaveis_OnRowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                if (listaDeResponsaveis != null)
                {
                    Business.Model.Responsavel responsavel = (Business.Model.Responsavel)e.Row.DataItem;
                    foreach (Business.Model.Responsavel responsavelDaLista in listaDeResponsaveis)
                    {
                        if (responsavelDaLista.Codigo_Responsavel == responsavel.Codigo_Responsavel)
                        {
                            CheckBox checkBox = (CheckBox)e.Row.FindControl("checkBoxSelecionaResponsavel");
                            checkBox.Checked = true;
                        }
                    }
                }
            }
        }

        protected void buttonAddResponsavel_OnClick(object sender, EventArgs e)
        {
            gridViewResponsaveis.Visible = false;
            gridViewAddResponsaveis.Visible = true;
            buttonAddResponsavel.Visible = false;
            buttonFinalizarAddResponsavel.Visible = true;
            gridViewAddResponsaveis.DataSource = ObtemTodosOsResponsaveis();
            gridViewAddResponsaveis.DataBind();
        }

        private List<Business.Model.Responsavel> ObtemTodosOsResponsaveis()
        {
            DataSourceResponsavel dataSourceResponsavel = new DataSourceResponsavel();
            return dataSourceResponsavel.BuscaTodosResponsaveis();
        }

        protected void buttonFinalizarAddResponsavel_OnClick(object sender, EventArgs e)
        {
            EnableTextBoxGrauDeParentesco = true;
            listaDeResponsaveis = new List<Business.Model.Responsavel>();

            foreach (GridViewRow row in gridViewAddResponsaveis.Rows)
            {
                CheckBox checkBox = (CheckBox)row.FindControl("checkBoxSelecionaResponsavel");
                if (checkBox.Checked)
                {
                    DataSourceResponsavel dataSourceResponsavel = new DataSourceResponsavel();
                    HiddenField id = (HiddenField)row.FindControl("hiddenFieldId");
                    Business.Model.Responsavel responsavel = dataSourceResponsavel.BuscaResponsavel(Convert.ToInt32(id.Value));
                    listaDeResponsaveis.Add(responsavel);
                }
            }

            gridViewResponsaveis.DataSource = listaDeResponsaveis;
            gridViewResponsaveis.DataBind();
            gridViewResponsaveis.Visible = true;
            gridViewAddResponsaveis.Visible = false;
            buttonAddResponsavel.Visible = true;
            buttonFinalizarAddResponsavel.Visible = false;
        }

        protected void buttonSalvar_Onclick(object sender, EventArgs e)
        {
            try
            {
                List<Business.Model.Responsavel> listaDeResponsaveisAux = new List<Business.Model.Responsavel>();
                foreach (GridViewRow row in gridViewResponsaveis.Rows)
                {
                    HiddenField hiddenField = (HiddenField)row.FindControl("HiddenFieldId");
                    TextBox textBox = (TextBox)row.FindControl("textBoxGrauDeParentesco");
                    foreach (var item in listaDeResponsaveis)
                    {
                        if (item.Codigo_Responsavel == Convert.ToInt32(hiddenField.Value))
                        {
                            item.Grau_de_Parentesco = textBox.Text;
                            listaDeResponsaveisAux.Add(item);
                        }
                    }
                }
                listaDeResponsaveis = listaDeResponsaveisAux;
                if (!string.IsNullOrEmpty(hiddenFieldCodigoIdoso.Value))
                {
                    ArmazenaIdosoAlteracao();
                }
                else
                {
                    ArmazenaIdosoCadastro();
                }
            }
            catch (Exception ex)
            {

            }
        }

        protected void linkButtonVoltar_OnClick(object sender, EventArgs e)
        {
            Response.Redirect(paginaDeOrigem);
        }

        private void ArmazenaIdosoAlteracao()
        {
            try
            {
                Idoso idoso = new Idoso();
                idoso.Codigo_Idoso = Convert.ToInt32(hiddenFieldCodigoIdoso.Value);
                idoso.Nome_Idoso = textNomeDoIdoso.Text;
                idoso.CPF_Idoso = Util.CPF.ValidaCPF(textCpfDoIdoso.Text);
                idoso.RG_Idoso = textRgDoIdoso.Text;
                idoso.Data_de_Nascimento = Convert.ToDateTime(textDataDeNascimento.Text, new CultureInfo("pt-BR"));
                idoso.Sexo_Idoso = ObtemSexo(radioButtonListSexoDoIdoso.SelectedValue);
                idoso.Estado_Civil = ObtemEstadoCivil(Convert.ToInt32(dropDownListEstadoCivil.SelectedValue));
                idoso.Nacionalidade_Idoso = textBoxNacionalidade.Text;
                idoso.Naturalidade_Idoso = textBoxNaturalidade.Text;
                idoso.Grau_de_Instrucao_Idoso = textBoxGrauDeIntrucao.Text;
                idoso.Nome_do_Pai_Idoso = textBoxNomeDoPai.Text;
                idoso.Nome_da_Mae_Idoso = textBoxNomeDaMae.Text;
				string relatorio = SalvaArquivoRelatorioDeEncaminhamento(idoso.CPF_Idoso);
				if(relatorio == "")
				{
					relatorio = hiddenFieldLocalRelatorioIdoso.Value;
				}
                idoso.Relatorio_De_Encaminhamento = relatorio;
				
				string foto = SalvaFotoIdoso(idoso.CPF_Idoso);
				if(foto == "")
				{
					foto = hiddenFieldLocalFotoIdoso.Value;
				}
				idoso.Foto_Idoso = foto;

                if(listaDeResponsaveis == null || listaDeResponsaveis.Count == 0)
                {
                    throw new Exception("É necessário selecionar um responsável");
                }

                DataSourceIdoso dataSource = new DataSourceIdoso();
                int total = dataSource.UpdateIdoso(idoso);

                AtualizaResponsaveisDoIdoso(idoso.Codigo_Idoso);
                FinalizaCadastroComSucesso("Salvo com sucesso.");

            }
            catch (Exception ex)
            {
                FinalizaCadastroComErro(ex.Message);
            }
        }

        private void ArmazenaIdosoCadastro()
        {
            bool cadastroComSucesso;
            try
            {
                Idoso idoso = new Idoso();
                idoso.Nome_Idoso = textNomeDoIdoso.Text;
                idoso.CPF_Idoso = Util.CPF.ValidaCPF(textCpfDoIdoso.Text);
                idoso.RG_Idoso = textRgDoIdoso.Text;
                idoso.Data_de_Nascimento = Convert.ToDateTime(textDataDeNascimento.Text, new CultureInfo("pt-BR"));
                idoso.Funcionario = (Funcionario)Session["usuario"];
                idoso.Sexo_Idoso = ObtemSexo(radioButtonListSexoDoIdoso.SelectedValue);
                idoso.Estado_Civil = ObtemEstadoCivil(Convert.ToInt32(dropDownListEstadoCivil.SelectedValue));
                idoso.Nacionalidade_Idoso = textBoxNacionalidade.Text;
                idoso.Naturalidade_Idoso = textBoxNaturalidade.Text;
                idoso.Grau_de_Instrucao_Idoso = textBoxGrauDeIntrucao.Text;
                idoso.Nome_do_Pai_Idoso = textBoxNomeDoPai.Text;
                idoso.Nome_da_Mae_Idoso = textBoxNomeDaMae.Text;
				string relatorio = SalvaArquivoRelatorioDeEncaminhamento(idoso.CPF_Idoso);
				if(relatorio == "")
				{
					relatorio = hiddenFieldLocalRelatorioIdoso.Value;
				}
                if(relatorio == "")
                {
                    throw new Exception("É necessário selecionar o relatório de encaimnhamento.");
                }
                idoso.Relatorio_De_Encaminhamento = relatorio;
				
				string foto = SalvaFotoIdoso(idoso.CPF_Idoso);
				if(foto == "")
				{
					foto = hiddenFieldLocalFotoIdoso.Value;
				}
                idoso.Foto_Idoso = foto;

                if (listaDeResponsaveis == null || listaDeResponsaveis.Count == 0)
                {
                    throw new Exception("É necessário selecionar um responsável");
                }
                DataSourceIdoso dataSource = new DataSourceIdoso();
                int total = dataSource.InsertIdoso(idoso);
                int idDoIdoso = dataSource.BuscaCodigoDoIdosoPeloCPF(idoso.CPF_Idoso);
                ArmazenaResponsaveisDoIdoso(idDoIdoso);
                
                FinalizaCadastroComSucesso("Salvo com sucesso.");
                cadastroComSucesso = true;
            }
            catch (Exception ex)
            {
                FinalizaCadastroComErro(ex.Message);
                cadastroComSucesso = false;
            }
        }
		
        /// <summary>
        /// Salva a foto do idoso no diretório Arquivos/Fotos/CPF do idoso/imagem.jpg
        /// </summary>
        /// <param name="cpfDoIdoso"></param>
        /// <returns></returns>
		private string SalvaFotoIdoso(string cpfDoIdoso)
		{
			FileUpload fileUpload = (FileUpload)updatePanelFileUpload.FindControl("fileUploadFotoIdoso");
            if (fileUpload.HasFile)
            {
                try
                {
                    DirectoryInfo directoryInfo = new DirectoryInfo(Server.MapPath(string.Format("~/Arquivos/Fotos/{0}/", cpfDoIdoso)));
	                if (!directoryInfo.Exists)
	                {
	                    directoryInfo.Create();
	                }
	                fileUpload.SaveAs(directoryInfo + fileUpload.PostedFile.FileName);
	                return string.Format("/Fotos/{0}/{1}", cpfDoIdoso, fileUpload.FileName);
                }
                catch (Exception ex)
                {

                }
            }
            return "";
		}

        /// <summary>
        /// Salva o relatório de encaminhamento do idoso no diretório Arquivos/RelatoriosDeEncaminhamento/CPF do idoso/imagem.jpg
        /// </summary>
        /// <param name="cpfDoIdoso"></param>
        /// <returns></returns>
        private string SalvaArquivoRelatorioDeEncaminhamento(string cpfDoIdoso)
        {
			FileUpload fileUpload = (FileUpload)updatePanelFileUpload.FindControl("fileUploadRelatorioDeEncaminhamento");
            if (fileUpload.HasFile)
            {
                try
                {
                    DirectoryInfo directoryInfo = new DirectoryInfo(Server.MapPath(string.Format("~/Arquivos/RelatoriosDeEncaminhamento/{0}/", cpfDoIdoso)));
	                if (!directoryInfo.Exists)
	                {
	                    directoryInfo.Create();
	                }
	                fileUpload.SaveAs(directoryInfo + fileUpload.PostedFile.FileName);
	                return string.Format("/RelatoriosDeEncaminhamento/{0}/{1}", cpfDoIdoso, fileUpload.FileName);
                }
                catch (Exception ex)
                {

                }
            }
            return "";
        }

        private void ArmazenaResponsaveisDoIdoso(int idDoIdoso)
        {
            DataSourceIdoso dataSourceIdoso = new DataSourceIdoso();
            foreach (var item in listaDeResponsaveis)
            {
                dataSourceIdoso.InsertResponsavelDoIdoso(idDoIdoso, item.Codigo_Responsavel, item.Grau_de_Parentesco);
            }
        }

        private void FinalizaCadastroComSucesso(string mensagem)
        {
			labelFeedback.Text="Salvo com Sucesso!";
			labelFeedback.Attributes.Add("Style","color:#00FF00");
        }

        private void FinalizaCadastroComErro(string mensagem)
        {
			labelFeedback.Text="Erro! <br/>"+mensagem;
			labelFeedback.Attributes.Add("Style","color:#FF0000");
        }

        private EstadoCivil ObtemEstadoCivil(int codigoEstadoCivil)
        {
            DataSourceEstadoCivil dataSourceEstadoCivil = new DataSourceEstadoCivil();
            return dataSourceEstadoCivil.BuscaEstadoCivil(codigoEstadoCivil);
        }

        private Sexo ObtemSexo(string value)
        {
            DataSourceSexo dataSource = new DataSourceSexo();
            Sexo sexo = dataSource.BuscaSexo(Convert.ToInt32(value));
            return sexo;
        }

        private void AtualizaResponsaveisDoIdoso(int idDoIdoso)
        {
            DataSourceIdoso dataSourceIdoso = new DataSourceIdoso();
            dataSourceIdoso.DeleteResponsaveisDoIdoso(idDoIdoso);
            foreach (var item in listaDeResponsaveis)
            {
                dataSourceIdoso.InsertResponsavelDoIdoso(idDoIdoso, item.Codigo_Responsavel, item.Grau_de_Parentesco);
            }
        }
    }
}